# 版本: 1.0.0.20250825
# 作者: 陈振玺
# 功能: 数据可视化工具，支持Excel/CSV文件导入，柱形图绘制，误差棒显示以及显著性差异分析

# 添加包导入
library(optparse)

#' 数据可视化函数
#
#' 该函数支持导入Excel或CSV格式的文件作为输入数据，生成柱形图并进行显著性差异分析
#' @param file_path 文件路径，支持Excel(.xlsx)或CSV(.csv)格式
#' @param x_col X轴列名
#' @param y_cols Y轴列名向量，可指定多个列
#' @param group_col 分组列名（可选）
#' @return 图形对象列表
#' @import ggplot2
#' @import ggpubr
#' @import readxl
#' @import readr
#' @import dplyr
#' @import tidyr
#' @import rstatix
#' @export
r_vizcraft_data_visualizer <- function(file_path, x_col, y_cols, group_col = NULL) {
  # 检查文件格式并导入数据
  if (grepl("\.xlsx$", file_path)) {
    data <- readxl::read_excel(file_path)
  } else if (grepl("\.csv$", file_path)) {
    data <- readr::read_csv(file_path)
  } else {
    stop("不支持的文件格式，请使用Excel(.xlsx)或CSV(.csv)格式")
  }
  
  # 检查指定的列是否存在
  missing_cols <- setdiff(c(x_col, y_cols, group_col), names(data))
  if (length(missing_cols) > 0 && !all(is.na(missing_cols))) {
    stop(paste("以下列在数据中不存在:", paste(missing_cols, collapse = ", ")))
  }
  
  # 处理每个Y轴列
  plots <- list()
  for (y_col in y_cols) {
    # 准备数据
    if (is.null(group_col)) {
      plot_data <- data %>%
        dplyr::select(!!sym(x_col), !!sym(y_col)) %>%
        tidyr::drop_na()
      
      # 计算均值和标准差
      summary_data <- plot_data %>%
        dplyr::group_by(!!sym(x_col)) %>%
        dplyr::summarise(
          mean = mean(!!sym(y_col), na.rm = TRUE),
          sd = sd(!!sym(y_col), na.rm = TRUE),
          n = dplyr::n(),
          se = sd(!!sym(y_col), na.rm = TRUE) / sqrt(dplyr::n())
        )
    } else {
      plot_data <- data %>%
        dplyr::select(!!sym(x_col), !!sym(y_col), !!sym(group_col)) %>%
        tidyr::drop_na()
      
      # 计算均值和标准差
      summary_data <- plot_data %>%
        dplyr::group_by(!!sym(x_col), !!sym(group_col)) %>%
        dplyr::summarise(
          mean = mean(!!sym(y_col), na.rm = TRUE),
          sd = sd(!!sym(y_col), na.rm = TRUE),
          n = dplyr::n(),
          se = sd(!!sym(y_col), na.rm = TRUE) / sqrt(dplyr::n())
        )
    }
    
    # 创建基础柱形图
    if (is.null(group_col)) {
      p <- ggplot2::ggplot(summary_data, aes(x = !!sym(x_col), y = mean)) +
        ggplot2::geom_col() +
        ggplot2::geom_errorbar(aes(ymin = mean - se, ymax = mean + se), width = 0.2) +
        ggplot2::geom_text(aes(label = round(mean, 2)), vjust = -0.5, size = 3) +
        ggplot2::labs(x = x_col, y = y_col, title = paste("柱形图 -", y_col))
    } else {
      p <- ggplot2::ggplot(summary_data, aes(x = !!sym(x_col), y = mean, fill = !!sym(group_col))) +
        ggplot2::geom_col(position = "dodge") +
        ggplot2::geom_errorbar(aes(ymin = mean - se, ymax = mean + se), 
                              position = position_dodge(0.9), width = 0.2) +
        ggplot2::geom_text(aes(label = round(mean, 2)), vjust = -0.5, size = 3, position = position_dodge(0.9)) +
        ggplot2::labs(x = x_col, y = y_col, title = paste("柱形图 -", y_col))
      
      # 进行显著性差异分析
      if (length(unique(plot_data[[x_col]])) >= 2) {
        # 执行统计检验
        stat.test <- plot_data %>%
          rstatix::t_test(!!sym(y_col) ~ !!sym(x_col)) %>%
          rstatix::add_significance()
        
        # 添加显著性标记到图形
        p <- p + ggpubr::stat_compare_means(comparisons = list(unique(plot_data[[x_col]])), 
                                           method = "t.test", 
                                           label = "p.signif")
      }
    }
    
    # 保存图形到列表
    plots[[y_col]] <- p
  }
  
  return(plots)
}

#' 主函数，用于CLI参数解析
main <- function() {
  # 定义命令行选项
  option_list <- list(
    make_option(c("-i", "--input"), type = "character", default = NULL,
                help = "输入文件路径，支持Excel(.xlsx)或CSV(.csv)格式", metavar = "character"),
    make_option(c("-x", "--x_col"), type = "character", default = NULL,
                help = "X轴列名", metavar = "character"),
    make_option(c("-y", "--y_cols"), type = "character", default = NULL,
                help = "Y轴列名，多个列名用逗号分隔", metavar = "character"),
    make_option(c("-g", "--group_col"), type = "character", default = NULL,
                help = "分组列名（可选）", metavar = "character")
  )
  
  # 解析命令行参数
  opt_parser <- OptionParser(option_list = option_list)
  opt <- parse_args(opt_parser)
  
  # 检查必需参数
  if (is.null(opt$input) || is.null(opt$x_col) || is.null(opt$y_cols)) {
    stop("缺少必需的参数，请使用 --help 查看帮助信息")
  }
  
  # 解析Y轴列名
  y_cols <- unlist(strsplit(opt$y_cols, ","))
  
  # 调用可视化函数
  plots <- r_vizcraft_data_visualizer(opt$input, opt$x_col, y_cols, opt$group_col)
  
  # 输出图形
  for (y_col in names(plots)) {
    print(plots[[y_col]])
  }
}

# 如果脚本直接运行，则执行主函数
if (interactive() == FALSE) {
  main()
}